#include"mutex_guard.h"

// 多线程下抢票
int ticket = 10000;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; // 定义并初始化锁
Mutex m(&mutex);

void *my_stream(void *name)
{
    while (true)
    {
        usleep(1);//所有线程同时竞争抢票，防止一个线程竞争能力强导致抢光票

        mutex_guard m(&mutex);//while里的临时对象，出了while就自动销毁，下次进来再次创构建（是在不行就用裸的{}使其变成临界区的局部变量）

        //m.Lock(); // 上锁(只允许一个线程申请锁成功，其他线程没成功会进行等待)
        if (ticket > 0)             // 判断时会访问公共资源，并且也是计算
        {
            usleep(1000); // 先停一会，存在多线程几乎同时开始抢票的可能
            cout << (const char *)name << "线程抢到票了"<< "，当前票数编号：" << ticket << endl;
            ticket--;
            //m.UnLock();// 解锁
        }
        else
        {
            //m.UnLock();// 解锁
            break;
        }
        
    }
}
int main()
{
    //设置局部锁并初始化
    // pthread_mutex_t mutex;
    // pthread_mutex_init(&mutex,nullptr);
    
    pthread_t tid_1, tid_2, tid_3, tid_4, tid_5;
    pthread_create(&tid_1, nullptr, my_stream, (void *)"tid_1");
    pthread_create(&tid_2, nullptr, my_stream, (void *)"tid_2");
    pthread_create(&tid_3, nullptr, my_stream, (void *)"tid_3");
    pthread_create(&tid_4, nullptr, my_stream, (void *)"tid_4");
    pthread_create(&tid_5, nullptr, my_stream, (void *)"tid_5");

    pthread_join(tid_1, nullptr);
    pthread_join(tid_2, nullptr);
    pthread_join(tid_3, nullptr);
    pthread_join(tid_4, nullptr);
    pthread_join(tid_5, nullptr);

    //pthread_mutex_destroy(&mutex);//销毁锁

    return 0;
}